fix: align components with the real Etherpad colibris skin#4
fix: align components with the real Etherpad colibris skin#4JohnMcLear wants to merge 4 commits into
Conversation
The flagged components diverged from the real colibris skin: - EpButton primary was inverted (dark bg + green text). Real colibris .btn-primary is a primary-coloured (green) background with bg-coloured (white) text. Fixed; hover/active now darken via brightness filter. - EpChatMessage was a bubble-style redesign. Etherpad chat is a plain message line (#chattext p, padding 4px 10px): bold author, muted inline time, then the text — no bubbles, own/other styled the same. Ported. - EpEditor defaulted to a monospace font and #333 text. Etherpad's editor is proportional in --text-color (#485365). Defaults now follow the theme (--main-font-family / --text-color / --bg-color). Also carries the pnpm dlx→exec Playwright CI fix so this branch's browser tests pass independently of the docs PR. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- EpButton: the base button never set a background, so the browser's light ButtonFace leaked through default/ghost/icon variants — fine in light themes, glaringly wrong in dark. Reset to transparent (matches Etherpad's `background: none` base). - EpInput/EpNotification/EpToast: error/danger colour was #d9534f; use Etherpad colibris .btn-danger #d1242f for consistency. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
Review Summary by QodoAlign components with Etherpad colibris skin and fix CI
WalkthroughsDescription• Align EpButton primary variant to Etherpad colibris (green background, white text) • Reset button background to transparent to prevent browser default leak in dark themes • Redesign EpChatMessage from bubbles to plain inline format matching Etherpad • Update EpEditor to use proportional font and theme colors instead of monospace • Standardize error/danger color across components to Etherpad's #d1242f • Fix Playwright CI to use pinned version instead of latest Diagramflowchart LR
A["Components<br/>diverged from<br/>Etherpad"] -->|"Fix primary<br/>button styling"| B["EpButton<br/>green bg +<br/>white text"]
A -->|"Reset UA<br/>background"| C["EpButton<br/>transparent base"]
A -->|"Redesign to<br/>plain format"| D["EpChatMessage<br/>inline layout"]
A -->|"Use theme<br/>colors"| E["EpEditor<br/>proportional font"]
A -->|"Align danger<br/>color"| F["EpInput/Notification/<br/>Toast #d1242f"]
G["CI Issue<br/>pnpm dlx"] -->|"Use pinned<br/>version"| H["pnpm exec<br/>Playwright"]
File Changes1. src/EpButton.ts
|
Code Review by Qodo
1. Empty time adds gap
|
From a full component-by-component audit against the real colibris skin: - EpCheckbox: same inversion as the button — checked track used --text-color (dark) instead of --primary-color. Rebuilt as Etherpad's outlined toggle: bg-soft track with a text-soft border + thumb that turn primary-coloured (green) when checked (matches form.css :before/:after). - EpColorPicker: default swatches were generic saturated colours; replaced with Etherpad's pastel author-colour palette (AuthorManager.getColorPalette). - EpModal: backdrop was rgba(72,83,101,.3); use Etherpad's dialog backdrop rgba(0,0,0,.45) + blur(2px) (#settings-dialog::backdrop). - EpEditor: default link colour #0366d6 → Etherpad's #2e96f3. Audit found the remaining components (input, toast, notification, dropdown, toolbar-select, chat, user badge) already track the theme correctly. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
EpEditor mounted Etherpad's Ace engine inside a shadow root. Ace reads and
restores the caret via the document Selection API, which does not work
across a shadow boundary: getRangeAt() retargets the range to the shadow
host, so the caret always read as offset 0 and every keystroke inserted at
the document start — typing "hello" produced "olleh".
- EpEditor now renders into the light DOM (createRenderRoot returns this),
so the engine uses the standard, well-tested document-selection path.
Styles moved from `static styles` into an inline <style> (scoped under the
ep-editor element since :host no longer applies).
- AceEditor.getSelection() also gains a getComposedRanges({shadowRoots})
path as defensive support for any future shadow-DOM mounting, instead of
bailing on the shadow-DOM rangeCount===0 case.
Verified: typing, Enter, and mid-line insertion all produce correct text
with no console errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Why
The components diverged from Etherpad's actual
colibrisskin. The color tokens were correct (#485365 / #576273 / #64d29b / #d2d2d2 / #f2f3f4match the real palette), but several components applied them wrongly, so the UI didn't look like Etherpad.Fixes (each checked against
src/static/skins/colibris).btn-primaryis a green (--primary-color) background with white (--bg-color) text; the component had a dark background with green text. Fixed; hover/active darken via brightness.buttonset no background, so the browser's lightButtonFaceshowed throughdefault/ghost/icon— invisible in light themes, glaringly wrong in dark. Reset totransparent(matches Etherpad'sbackground: none).#chattext p, padding4px 10px): bold author, muted inline time, then text — no bubbles, own/other identical. Ported.monospace+#333. Etherpad's editor is proportional in--text-color(#485365). Defaults now follow the theme.EpInput/EpNotification/EpToastused#d9534f; aligned to Etherpad.btn-danger#d1242f.Audit of the rest
I scanned every component for hardcoded colors that bypass the theme. Aside from the above, the remaining components correctly use
var(--token). Components without a direct Etherpad equivalent (card, color wheel, user badge) are left as palette-consistent extensions.Verification
pnpm typecheckclean,pnpm test --run→ 82/82.(Also carries the
pnpm dlx→pnpm execPlaywright CI fix so this branch's browser tests pass independently.)🤖 Generated with Claude Code